/* 
 *  PDA project -- UBS/IUT de Vannes -- Dept Informatique
 *
 *  $Id$
 *
 *  Copyright 2007-08 © IUT de Vannes
 *  Ce logiciel pédagogique est diffusé sous licence GPL
 */
package pda.ancien;

import pda.base.IApplication;
import pda.base.IPda;

import java.awt.event.*;
import java.util.StringTokenizer;
import java.util.regex.*;
import javax.swing.*;

/**
 * <h1>Classe Ancien - Le controller de l'application</h1>
 * Elle fait office de Controller dans le modele MVC. Elle fait le lien entre l'application PDA et l'application Ancien
 * Cette classe gere aussi les evenements généres lors de clics sur des boutons etc.
 * Chaque clic est capté dans cette methode et génère l'appel de methodes spécifiques.
 * @author Mathieu Cornic
 * @author Camille Guerin
 * A rendre Jeudi 19 juin 2008
 */
public class Ancien implements IApplication, ActionListener {

    protected String name = "Ancien";//Le nom de l'application
    protected AncienView view;//L'interface de lapplication
    protected AncienModel model;//Le model de l'application

    /**
     * Constructeur du controller de l'ancien
     */
    public Ancien () {
        model = new AncienModel ();
        view = new AncienView (this, model);
    } // --------------------------------------------------------- Ancien ()
    
    /**
     * Methode qui gere les evenements et genere des actions en conséquence
     * @param e evenement, action sur la fenetre
     */
    public void actionPerformed (ActionEvent e) {
		
	String evt = e.getActionCommand ();//on recupere l'actionCommand correspondant à l'evenement
		
	//On créé un pattern et un matcher pour récuperer l'actionCommand qui aura un nom commençant par "edit"
	Pattern editPattern = Pattern.compile ("edit");
	Matcher editMatcher = editPattern.matcher (evt);
		
	//On créé un pattern et un matcher pour récuperer l'actionCommand qui aura un nom commençant par "suppr"
	Pattern supprPattern = Pattern.compile ("suppr");
	Matcher supprMatcher = supprPattern.matcher (evt);

	//Si l'actionCommand comprend le string "edit"
	if (editMatcher.find ()) {
	    //Alors on utilise un tokenizer pour récuperer le chiffre apres le mot edit. Il correspond à l'id de l'activite
	    StringTokenizer st = new StringTokenizer (evt, "edit");
	    view.modifierActivitePanel (Integer.parseInt (st.nextToken ()));//on appelle la methode graphique de modifier selon l'id de l'activite

	} else if (supprMatcher.find ()) {
	    //Si l'actionCommand comprend le string "suppr"
	    //Alors on utilise un tokenizer pour récuperer le chiffre apres le mot suppr. Il correspond à l'id de l'activite
	    StringTokenizer st = new StringTokenizer (evt, "suppr");
	    view.supprimerActivite (Integer.parseInt (st.nextToken ()));//on appelle la methode graphique de modifier selon l'id de l'activite
	    view.initJourPanel ();//on revient au panel du jour

	} else if (evt.equals ("OptionsBase")) {
	    //Si on clique sur le bouton options du calendrier
	    System.out.println ("Options base");
	    view.popUpMenu.setVisible (true);//On rend le popUp visible (mais il n'est pas encore affiche graphiquement)
	    int posXpopup = 0;//on initialise la position horizontale du popUp à 0 (le pop up colle au coté gauche)
	    int posYpopup = - (view.getPopUpMenuHeight ());//On initialise la position verticale du popUp en fonction de sa hauteur (- la hauteur)
	    view.popUpMenu.show (view.options,posXpopup, posYpopup);//on affiche le popUp

	} else if (evt.equals ("OptionsActivite")) {
	    //Si on clique sur le bouton options lorsqu'on est sur l'ecran d'un jour precis
	    //meme raisonnement que pour le popup du menu option du calendrier
	    System.out.println ("options activite");
	    view.popUpMenuActivite.setVisible (true);
	    int posXpopup = 0;
	    int posYpopup = - (view.getPopUpMenuActiviteHeight ());
	    view.popUpMenuActivite.show (view.nouvelleActivite,posXpopup, posYpopup);

	} else if (evt.equals ("Annee Precedente")) {
	    //Si on clique sur la fleche de l'annee precedente
	    //on enleve 1 a l'anneeCourante pour correspondre a l'annee precedente
	    view.setAnneeCourante (view.getAnneeCourante ()-1);
	    view.changerDate ();//on affiche le calendrier en fonction de la nouvelle annee
	    System.out.println ("Annee précédent - "+ view.getAnneeCourante ());

	} else if (evt.equals ("Annee Suivante")) {
	    //Si on clique sur la fleche de l'annee suivante
	    //on ajoute 1 a l'anneeCourante pour correspondre a l'annee suivante
	    view.setAnneeCourante (view.getAnneeCourante ()+1);
	    view.changerDate ();//on affiche le calendrier en fonction de la nouvelle annee
	    System.out.println ("Annee suivante - "+ view.getAnneeCourante ());

	} else if (evt.equals ("Jour precedent")) {
	    //Si on clique sur la fleche du jour precedent
	    System.out.println ("jour precedent");
	    view.setJourPrecedent ();//On met a jour la date pour que le jour soit le precedent (prise en compte du changement de mois)
	    view.initJourPanel ();//on met a jour le panel du jour

	} else if (evt.equals ("Jour suivant")) {
	    //Si on clique sur la fleche du jour suivant
	    System.out.println ("jour suivant");
	    view.setJourSuivant ();//On met a jour la date pour que le jour soit le suivant (prise en compte du changement de mois)
	    view.initJourPanel ();//on met a jour le panel du jour

	} else if (evt.equals ("DateChangee")) {
	    //Si on change le mois de la JComboBox
	    //On met a jour le calendrier
	    view.changerDate ();

	} else if (evt.equals ("retourJourVersCalendrier")) {
	    //Si on clique sur le bouton retour du Jour, on retourne vers le calendrier
	    view.changerDate ();
	    view.initNouveauCalendrier ();//on retourne sur le calendrier de depart
	    System.out.println ("retour jour vers calendrier");

	} else if (evt.equals ("retourActiviteVersCalendrier")) {
	    //Si on clique sur le bouton retour de la nouvelle Activite, on retourne vers le calendrier
	    if (view.isPasseParMenuPopUpActivite ())
		view.initJourPanel ();
	    else {
		view.changerDate ();
		view.initNouveauCalendrier ();
		//on retourne sur le calendrier de depart
		System.out.println ("retour activite vers calendrier");
	    }

	} else if (evt.equals ("retourModifierAJour")) {
	    view.changerDate ();
	    view.initJourPanel ();

	} else if (evt.equals ("Autre")) {
	    //Si on clique sur l'Item de menu "Autre"
	    //On affiche l'ecran de la nouvelle activite par defaut
	    view.initNouvelleActiviteDefaut ();
	    view.setDateCliquee ();//et on met a jour par defaut la date dans cet ecran (en fonction du jour cliqué)

	} else if (evt.equals ("RDV")) {
	    //Si on clique sur l'Item de menu "RDV"
	    //On affiche l'ecran du nouveau rdv
	    view.initNouvelleActiviteRDV ();
	    view.setDateCliquee ();
	} else if (evt.equals ("Reunion")) {
	    //Si on clique sur l'Item de menu "Reunion"
	    //On affiche l'ecran de la nouvelle reunion
	    view.initNouvelleActiviteReunion ();
	    view.setDateCliquee ();
	} else if (evt.equals ("Cours")) {
	    //Si on clique sur l'Item de menu "Cours"
	    //On affiche l'ecran du nouveau cours
	    view.initNouvelleActiviteCours ();
	    view.setDateCliquee ();
	} else if (evt.equals ("Enregistrer")) {
	    //Si on clique sur le bouton enregistrer de l'ajout d'un nouvelle activite

	    if (view.ajouterActivite ()) {
		//Si ajouterActivite renvoit vrai (cad que l'activite a ete ajoutee)

		if (view.isPasseParMenuPopUpActivite ()) {
		    //Si on est passé par le menu popUp du jour
		    //on revient au jour
		    view.initJourPanel ();
		} else {
		    //Sinon, on revient au panel principal
		    view.changerDate ();
		    view.initNouveauCalendrier ();
		}
	    }	

	} else if (evt.equals ("EnregistrerModifier")) {
	    //Si on clique sur le bouton enregistrer de la modification d'une activite

	    if (view.modifierActivite ()) {
		//Si modifierActivite renvoit vrai (car que la modification a pu etre faite)
		//On sauvegarde et on revient au panel principal
		view.sauvegarde ();
		view.changerDate ();
		view.initNouveauCalendrier ();
	    }

	} else if (evt.equals ("Supprimer toutes activites")) {
	    //Si on clique sur l'item de menu "supprimer toutes activites"
	    view.changerDate ();
	    view.supprimerToutesActivites ();//On supprime toutes les activites
	    view.sauvegarde ();//on sauvegarde
	    view.initNouveauCalendrier ();//et on revient sur le panel principal
			
	} else if (evt.equals ("Sauvegarder des activites")) {
	    //Si on clique sur l'item de menu "sauvegarder des activites"
	    view.changerDate ();
	    view.sauvegarderListeSous ();//On sauvegarde la liste
	    view.initNouveauCalendrier ();//et on met a jour le panel principal
			
	} else if (evt.equals ("Importer des activites")) {
	    //Si on clique sur l'item de menu "importer des activites"
	    view.changerDate ();
	    view.importerListe ();//on importe une liste
	    view.initNouveauCalendrier ();//et on met a jour le panel principal
			
	} else {
	    //Si tous les evenement capté dans le view ne sont pas ceux précedents,
	    //c'est que ce sont des evenement lies aux boutons des jours
	    view.setJour (Integer.parseInt (e.getActionCommand ()));//on met a jour le jour courant en fonction du bouton cliqué
	    view.initJourPanel ();//On affiche le panel du Jour correspondant
	}
    }//-------------------------------------------------------------------actionPerformed (e : ActionEvent)

    //###########################Méthodes de base presentes dans les autre applications ########################
    
    /* 
     *  see interface documentation
     */
    public void start (IPda pda) {
    	view.initPanel ();
    } // -------------------------------------------------------------- start ()

    /* 
     *  see interface documentation
     */
    public String getAppliName () {
    	return name;
    } // ---------------------------------------------------------- Ancien ()

    /* 
     *  see interface documentation
     */
    public JPanel getAppliPanel () {
    	return view.getPanel ();
    } // ---------------------------------------------------------- Ancien ()

    /* 
     *  see interface documentation
     */
    public boolean close () {
	return true;
    } // ---------------------------------------------------------- Ancien ()


} // ---------------------------------------------------------- Class Ancien
